/* -------------------------------------------------------------------------
 *
 * valid.h
 *	  POSTGRES tuple qualification validity definitions.
 *
 *
 * Portions Copyright (c) 1996-2012, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/access/valid.h
 *
 * -------------------------------------------------------------------------
 */
#ifndef VALID_H
#define VALID_H

/*
 *		HeapKeyTest
 *
 *		Test a heap tuple to see if it satisfies a scan key.
 */
#define HeapKeyTest(tuple, tupdesc, nkeys, keys, result)                                                           \
    do {                                                                                                           \
        /* Use underscores to protect the variables passed in as parameters */                                     \
        int __cur_nkeys = (nkeys);                                                                                 \
        ScanKey __cur_keys = (keys);                                                                               \
                                                                                                                   \
        (result) = true; /* may change */                                                                          \
        for (; __cur_nkeys--; __cur_keys++) {                                                                      \
            Datum __atp;                                                                                           \
            bool __isnull;                                                                                         \
            Datum __test;                                                                                          \
                                                                                                                   \
            if (__cur_keys->sk_flags & SK_ISNULL) {                                                                \
                (result) = false;                                                                                  \
                break;                                                                                             \
            }                                                                                                      \
                                                                                                                   \
            __atp = heap_getattr((tuple), __cur_keys->sk_attno, (tupdesc), &__isnull);                             \
                                                                                                                   \
            if (__isnull) {                                                                                        \
                (result) = false;                                                                                  \
                break;                                                                                             \
            }                                                                                                      \
                                                                                                                   \
            __test =                                                                                               \
                FunctionCall2Coll(&__cur_keys->sk_func, __cur_keys->sk_collation, __atp, __cur_keys->sk_argument); \
                                                                                                                   \
            if (!DatumGetBool(__test)) {                                                                           \
                (result) = false;                                                                                  \
                break;                                                                                             \
            }                                                                                                      \
        }                                                                                                          \
    } while (0)

#endif /* VALID_H */
